#include "Agenda.h"

void agendaInitialiser(Agenda * pAgenda)
{
    pAgenda->Contacts=NULL;
}


void agendaAjouter(Agenda *pAgenda, const Contact *pContact)
{
    pAgenda->Contacts=g_list_insert_sorted(pAgenda->Contacts, (Contact *)pContact,
                                           (GCompareFunc)contactComparer);
//    pAgenda->Contacts=g_list_append(pAgenda->Contacts, pContact);
}


void agendaSupprimer(Agenda *pAgenda, const char* Nom)
{
    Contact* pResultat= agendaRechercher(pAgenda, Nom);
    pAgenda->Contacts=g_list_remove(pAgenda->Contacts, pResultat);
}


Contact* agendaRechercher(const Agenda *pAgenda, const char* Nom)
{
    GList* pResultat= g_list_find_custom(pAgenda->Contacts, Nom, (GCompareFunc)contactComparer);
    if(pResultat==NULL)
    {
        printf("contact non trouvé");
        return NULL;
    }
    else
    {
        return (Contact*)g_list_nth_data(pResultat,0);
        /* Rmq: on ne libère jamais pResultat ce n'est pas une nouvelle liste */
    }
}


Contact *agendaGetContact(const Agenda *pAgenda, int i)
{
    if (i>g_list_length(pAgenda->Contacts))
    {
        printf("le contact n'est pas dans la liste \n");
        return NULL;
    }
    else
    {
        return (Contact *)g_list_nth_data((*pAgenda).Contacts, (guint)i);
    }
}


void agendaLiberer(Agenda *pAgenda)
{
    g_list_free_full(pAgenda->Contacts, (GDestroyNotify)contactLiberer );
    //g_list_free(pAgenda->Contacts);
    //pAgenda->Contacts=NULL;
    pAgenda=NULL;
}


void agendaAjouter2(Agenda *pAgenda)
{
    Contact* c;
    contactInitialiser(&c);
    contactSaisir(c);
    agendaAjouter(pAgenda, c);
}


int agendaTaille(const Agenda *pAgenda)
{
      return  (int)g_list_length(pAgenda->Contacts);
}


void agendaAfficher(const Agenda* pAgenda)
{
    int i;
    for (i=0; i< agendaTaille(pAgenda); i++)
    {
        contactAfficher(agendaGetContact(pAgenda, i));
        printf("\n \n");
    }
}


void agendaSauver(const Agenda *pAgenda, const char * nomfichier)
{
    FILE* f;
    int i;
	Contact *pcont;

    f = fopen(nomfichier, "w");
    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", nomfichier);
        assert( f );
    }
    fprintf(f , "Agenda: \n");
    fprintf(f , "nbContact: %d \n \n", g_list_length(pAgenda->Contacts));

    for(i=0; i< agendaTaille(pAgenda); i++)
    {
        pcont = agendaGetContact(pAgenda, i);
        assert(fprintf(f,"nom: %s \n", contactGetNom(pcont))>=1);
        assert(fprintf(f,"prenom: %s \n", contactGetPrenom(pcont))>=1);
        assert(fprintf(f,"mail: %s \n", contactGetMail(pcont))>=1);
        assert(gmp_fprintf(f,"clef publique: (%Zd, %Zd) \n", ClefPubliqueGetn(contactGetClefPublique(pcont)), ClefPubliqueGetc(contactGetClefPublique(pcont)) )>=2);
        assert(fprintf(f, "\n \n")>0);
    }
    printf("Sauvegarde de l'agenda: %s ...OK\n", nomfichier);
    fclose(f);
}


void agendaCharger(Agenda *pAgenda, const char * nomfichier)
{
    FILE* f;
    Contact *pcont;
    int i;
    int taille;

    f = fopen(nomfichier, "r");
    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", nomfichier);
        assert( f );
    }

    assert( fscanf( f , "Agenda: \n nbContact: %d \n", &taille) >=0);
    agendaInitialiser(pAgenda);

    for(i=0; i< taille; i++)
    {
        contactInitialiser(&pcont);
        assert(fscanf(f,"nom: %s \n", (char *)&(pcont->Nom))>=1);
        assert(fscanf(f,"prenom: %s \n", (char *)&(pcont->Prenom))>=1);
        assert(fscanf(f,"mail: %s \n", (char *)&(pcont->Mail))>=1);
        assert(gmp_fscanf(f, "clef publique: (%Zd, %Zd) \n", ClefPubliqueGetn(contactGetClefPublique(pcont)), ClefPubliqueGetc(contactGetClefPublique(pcont)))>=2);
        assert(fscanf(f, "\n \n")>=0);
        agendaAjouter(pAgenda, pcont);
    }
    fclose(f);
    printf("Lecture de l'agenda: %s ...OK\n", nomfichier);
}


void testRegressionAgenda()
{
    printf("test regression Agenda \n");
    Agenda a1;
    Agenda a2;
    agendaInitialiser(&a1);
    agendaAjouter2(&a1);
    agendaAjouter2(&a1);
    printf("voici la taille de l'agenda: %d \n", agendaTaille(&a1));
    agendaAjouter2(&a1);
    printf("voici la taille de l'agenda: %d \n", agendaTaille(&a1));
    agendaAfficher(&a1);
    printf("voici le premier pointeur: %p \n", agendaGetContact(&a1, 1));
    agendaSauver(&a1, "testagenda");
    agendaCharger(&a2, "testagenda");

    printf("voici le contact ayant pour nom coladon : \n");
    contactAfficher(agendaRechercher(&a2, "coladon"));

    printf("On le supprime et on affiche l'agenda \n");
    //agendaSupprimer(&a2, "coladon");

    agendaAfficher(&a2);

    //contactAfficher(agendaGetContact(&a1, 1));
    //contactAfficher(agendaGetContact(&a1, 2));
    agendaLiberer(&a1);
    agendaLiberer(&a2);

}
